package main

import "fmt"

type Humaner interface {
	// 方法，只有生命，没有实现 --> 由别的类型（自定义类型）实现
	// 同时，注意是要实现所有方法，如果一个没有就不能算是实现该接口
	sayhi()
	//eat()
}

type Student struct {
	name string
	age  int
}

// Student实现了该方法 --> 普通变量
func (tmp Student) sayhi() {
	fmt.Println("Student:", (tmp))
}

// Teacher实现了该方法 --> 指针
type Teacher struct {
	addr  string
	teach string
}

func (tmp *Teacher) sayhi() {
	fmt.Println("Teacher:", *tmp)
}

func main() {
	// 定义接口类型的变量
	var h Humaner

	// 只是实现了该接口方法的类型，那么就可以赋值给i --> 同时要注意接收者类型
	h = Student{"mike", 18}
	h.sayhi() // Student: {mike 18}

	// 注意接收者类型，Teacher为指针
	h = &Teacher{"sh", "go"}
	h.sayhi() // Teacher: {sh go}
}
